<?php

namespace app\admin\middleware;

use think\facade\Request;
use app\admin\model\Admin;
use app\admin\model\Error;
use think\facade\Cookie;
use think\facade\Config;

/**
 * 身份验证处理
 */
class Auth
{

    /**
     * 记录错误并跳转到登录页面
     */
    private function error()
    {
        $cmd = 'request';
        Error::add($cmd);
        return redirect(url('admin/index/index')->build());
    }

    /**
     * 检查二步验证
     * @return boolean
     */
    public function totp()
    {
        $totp = Cookie::get('totp');
        if (empty($totp)) {
            return false;
        }
        openssl_private_decrypt(base64_decode($totp), $decryptedData, Config::get('xp.private_key'), OPENSSL_PKCS1_OAEP_PADDING);
        if ($decryptedData == md5(USER->totp . USER->salt)) {
            return true;
        }
        return false;
    }

    /**
     * 检查登录信息
     */
    public function check()
    {
        $auth = Cookie::get('auth');
        if ($auth) {
            openssl_private_decrypt(base64_decode($auth), $decryptedData, Config::get('xp.private_key'), OPENSSL_PKCS1_OAEP_PADDING);
            if (empty($decryptedData)) {
                return false;
            }
            [$id, $ip, $password, $time] = explode("\t", $decryptedData);
            $curr_ip = Request::ip();
            $envMode = env('ENV_MODE');
            $cmd = 'request';
            $check = Error::check($cmd);
            if ($envMode == 'demo'){
                // 1. 检查请求错误次数
                if (!$check) {
                    $admin = Admin::find($id);
                    if (
                        // 2. 检查用户是否存在 与状态
                        $admin &&
                        $admin->status == 0 &&
                        // 3. 检查密码
                        verifyPassword($admin->password, $password, $admin->salt)
                    ) {
                        // 返回用户信息
                        return $admin;
                    }
                }
            }else{
                // 1. 判断 IP
                if ($curr_ip == $ip) {
                    // 2. 检查请求错误次数
                    if (!$check) {
                        $admin = Admin::find($id);
                        if (
                            // 3. 检查用户是否存在 与状态
                            $admin &&
                            $admin->status == 0 &&
                            // 4. 检查请求时间 与 ip
                            $time == strtotime($admin->update_time) &&
                            $curr_ip == $admin->update_ip &&
                            // 5. 检查密码
                            verifyPassword($admin->password, $password, $admin->salt)
                        ) {
                            // 返回用户信息
                            return $admin;
                        }
                    }
                }
            }
            
        }
        return false;
    }

    /**
     * 处理请求
     */
    public function handle($request, \Closure $next)
    {
        if (defined('UID')) {
            $request->user = USER;
            if (USER->totp && !$this->totp()) {
                // 开启了二步验证
                return redirect(url('admin/index/lock')->build());
            }
            // 判断当前应用是否可用
            $appName = app('http')->getName();
            $lockFile = base_path() . $appName . '/config/delete.lock';
            // 应用不存在或已停用 ? 跳转到 404 页面 : 否则继续执行
            return file_exists($lockFile) ? redirect(url('admin/dashboard/message404')->build()) : $next($request);
        }
        return $this->error();
    }
}
